import subprocess
from logovani import gsmLogger
import commands, os
import time
from nacteniKonfigurace import pidGsmRobot, razitkoGSMZije, pozadavekNaRestartGSM, semaforAutomatNabiha
from nacteniKonfigurace import semaforPrihlasenTechnik, razitkoCrocoMainZije, razitkoNacitaniDatZije
from nacteniKonfigurace import pozadavekChciProvest, razitkoHsoRestart, pocetOpakovaniPrenosuCentrala, pocetOpakovaniPrenosuTelem
from bz2_gprs_ftp import GprsKomunikace

gprs = GprsKomunikace()
def zabijGmsRobot():
    if os.path.exists(pidGsmRobot):
        f=open(pidGsmRobot, 'r')    
        nactenyRadek = f.readline() 
        f.close()
        PID = nactenyRadek.rstrip() # nacteme bez "\n"       
        if 'python' in commands.getoutput("ps -p %s" % PID):
            subprocess.call(["kill -9 %s" % PID],shell=True)           
    
def zjistiDeviceModemu():
    # Nacte radek port = /dev/neco, vrati device. File vzdy existuje, radek taky. Jinak
    # automat nejede ...
    f=open("/etc/gammurc","r")
    radky=f.readlines()
    f.close()
    for r in radky:
        if r.startswith("port"):
            device=r.rstrip().split('/',1)[1]
            return "/%s" % device
    # at vratime retezec v kazdem pripade ...
    return "notfound"
    
def vypniZapniUsbVcc():
    text = 'USB Vcc off/on'
    print text
    gsmLogger.error(text)    
    subprocess.call(["killall pppd"],shell=True)
    text = "prvni lsof"
    print text
    gsmLogger.error(text)
    device=zjistiDeviceModemu()
    text=commands.getoutput("lsof %s" % device)
    print text
    gsmLogger.debug(text)
    subprocess.call(["rmmod ehci_hcd"],shell=True)
    subprocess.call(["rmmod ohci_hcd"],shell=True)
    subprocess.call(["usb_geode_pwr_ctl off"],shell=True)
    time.sleep(5)
    subprocess.call(["usb_geode_pwr_ctl on"],shell=True)        
    time.sleep(5)
    subprocess.call(["modprobe ohci_hcd"],shell=True)
    subprocess.call(["modprobe ehci_hcd"],shell=True)
    time.sleep(50)        
    text = "druhy lsof"
    print text
    gsmLogger.error(text)
    text=commands.getoutput("lsof %s" % device)
    print text
    if text: gsmLogger.error(text)
    return        

def overCasProvedRestartStroje():
    # Pro HSO driver nefunguje stabilne unloading driveru, takze po nejake dobe (3 hod,
    # aby to nebylo moc casto) provedeme restart stroje.
    if not os.path.exists(razitkoHsoRestart):
        f=open(razitkoHsoRestart,'w')
        f.close()
    # Toto provedeme vzdy
    subprocess.call(["killall pppd"],shell=True)
    # Dale kontrola casu ...
    if (time.time() - os.stat(razitkoHsoRestart).st_mtime) > 3 * 3600:
        # na restart uz cekame dost dlouho
        os.remove(razitkoHsoRestart)
        gsmLogger.critical('provadim restart stroje kvuli HSO')
        subprocess.call(["sh /automat/restart.sh"],shell=True)
    return

def rozhodniZdaRestartovatGSM():
    if os.path.exists(semaforAutomatNabiha) or os.path.exists(semaforPrihlasenTechnik):
        return
    elif  os.path.exists(pozadavekNaRestartGSM):
        text="pozadovan restart gsm_robot.py"
        print text
        gsmLogger.error(text)
        os.remove(pozadavekNaRestartGSM)
        return True 
    elif os.path.exists(razitkoGSMZije) and not gprs.existujePidOvereneBeziciVPN:
        timestampVytvoreniSouboru = os.stat(razitkoGSMZije).st_mtime
        if time.time() - timestampVytvoreniSouboru  > (60*5): # kdyz skript gsm_robot nejede dele nez 5 minut
            text="gsm_robot.py 5 minut neaktivni"
            print text
            gsmLogger.error(text)
            return True 
    elif not os.path.exists(razitkoGSMZije):
        text="skript gsm_robot.py jeste nebyl spusten, sustime jej nyni"
        print text
        gsmLogger.debug(text)
        return True 

def rozhodniZdaRestartovatAutomat():
    if os.path.exists(semaforAutomatNabiha) or os.path.exists(semaforPrihlasenTechnik):
        return        
    if os.path.exists(razitkoCrocoMainZije):        
        timestampVytvoreniSouboru = os.stat(razitkoCrocoMainZije).st_mtime
        if time.time() - timestampVytvoreniSouboru > (60*2): 
            text= "croco_main neni 2 min. aktivni, restart vsech skriptu"
            print text
            gsmLogger.critical(text)
            f = open(pozadavekChciProvest, "w")        
            f.write('vzdalenyRestartNouzovy')  
            f.close()            
    if os.path.exists(razitkoNacitaniDatZije):        
        timestampVytvoreniSouboru = os.stat(razitkoNacitaniDatZije).st_mtime
        if time.time() - timestampVytvoreniSouboru > (60*2): 
            text= "nacitaniDatAutomatu neni 2 min. aktivni, restart vsech skriptu"
            print text
            gsmLogger.critical(text)
            f = open(pozadavekChciProvest, "w")        
            f.write('vzdalenyRestartNouzovy')  
            f.close()            

if __name__ == '__main__':    
    try:
        rozhodniZdaRestartovatAutomat()        
        if rozhodniZdaRestartovatGSM():
            zabijGmsRobot()
            device=zjistiDeviceModemu()
            # smazeme pocitadlo opakovani prenosu, pokud jsme zacali delat restart modemu
            if os.path.exists(pocetOpakovaniPrenosuCentrala):
                os.remove(pocetOpakovaniPrenosuCentrala)
            if os.path.exists(pocetOpakovaniPrenosuTelem):
                os.remove(pocetOpakovaniPrenosuTelem)
            # elektro reset zlobi s HSO Option modemy ... takze pro ne mame neco jineho ...
            if not device.endswith("wmodem0"): vypniZapniUsbVcc()
            else: overCasProvedRestartStroje()
            subprocess.Popen(["/usr/bin/open", "-c", "10", "-f", "python", "/automat/gsm_robot.py"], close_fds=True)
    except Exception, why:        
        print why
        gsmLogger.error(why)
